//#ifndef __MY_ClientBackup__
//#define __MY_ClientBackup__

//#include "dataManager.hpp"
//#include "httplib.h"
//#include <windows.h>
//#include <QDebug>
//#include <chrono>
//#include <optional>
//#include <ctime>
//#include <experimental/filesystem>
//#include <QFileSystemWatcher>

//#include <QDir>
//namespace cloudBackup
//{
//#define SERVER_ADDR "120.46.25.211"
//#define SERVER_PORT 8585

//class ClientBackup
//{
//    Q_OBJECT
//private:
//    std::string _backupDir;
//    DataManager* _dataManager;
//    //QSqlDatabase _cloneDB;
//public:
//    // 初始化指定的监测备份文件
//    ClientBackup(const std::string& backupDir,int usrID)
//        : _backupDir(backupDir)
//    {
//        _dataManager = new DataManager(usrID);
//    }

//    std::string GetFileSelfEtag(const std::string& filePath)
//    {
//        // a.txt-fsize-ctime
//        FileUtil fileUtil(filePath);
//        std::stringstream ss;
//        ss << fileUtil.FileName() << "-" << fileUtil.FileSize() << "-" << fileUtil.LastCTime();
//        return ss.str();
//    }

//    //        std::string GBKToUTF8(const std::string& strGBK)
//    //        {
//    //            // 将GBK编码转换为Unicode
//    //            int len = MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, NULL, 0);
//    //            std::vector<wchar_t> wstr(len);
//    //            MultiByteToWideChar(CP_ACP, 0, strGBK.c_str(), -1, wstr.data(), len);

//    //            // 将Unicode编码转换为UTF-8
//    //            len = WideCharToMultiByte(CP_UTF8, 0, wstr.data(), -1, NULL, 0, NULL, NULL);
//    //            std::vector<char> strUTF8(len);
//    //            WideCharToMultiByte(CP_UTF8, 0, wstr.data(), -1, strUTF8.data(), len, NULL, NULL);

//    //            return std::string(strUTF8.data());
//    //        }

//    bool Upload(const std::string& filename)
//    {
//        // 1. 获取文件数据
//        FileUtil fileUtil(filename);
//        std::string content;
//        fileUtil.GetContent(&content);

//        // 2. 搭建http客户端上传文件
//        httplib::Client client(SERVER_ADDR, SERVER_PORT);

//        httplib::MultipartFormData item;
//        item.name = "file";
//        item.filename = fileUtil.FileName().c_str();
//        item.content = content;
//        item.content_type = "application/octet-stream";

//        httplib::MultipartFormDataItems items;
//        items.push_back(item);

//        auto httpResult = client.Post("/upload", items);
//        if (!httpResult || httpResult->status != 200)
//            return false;

//        return true;
//    }

//    bool IsNeedUpload(const std::string& filePath)
//    {
//        // 需要上传：文件是新增的 不是新增但被修改过
//        // 文件是新增的：没有历史备份信息
//        // 不是新增但被修改且一段时间内没有连续修改：有历史信息 但是历史id与当前id不一致

//        std::string id;
//        if (_dataManager->GetOneByKey(filePath, &id) != false)
//        {
//            // 有历史信息
//            std::string new_id = GetFileSelfEtag(filePath);
//            if (new_id == id)
//                return false; // 不需要被上传-上次上传后没有被修改过
//        }
//        // 场景：文件比较大 正在不断拷贝到这个目录下 此时每次遍历id
//        // 都会判断id不一致需要上传 此情况下一个文件可能被多次认为需要上传
//        // 因此应该判断一个文件一段时间都没有被修改过才能上传

//        FileUtil fileUtil(filePath);
//        // 3秒钟之内刚修改过 认为文件还在修改中 即处于“不稳定”状态
//        if (time(NULL) - fileUtil.LastMTime() < 3)
//            return false;

//        return true;
//    }

//    bool RunClientBackupModule()
//    {
//        QFileSystemWatcher watcher;

//        // 要监测的文件夹路径
//        QString folderPath = QString::fromStdString(_backupDir);

//        // 添加监测的文件夹
//        watcher.addPath(folderPath);

//        // 连接信号和槽
//        QObject::connect(&watcher, &QFileSystemWatcher::directoryChanged,
//                         [=](const QString &dir) {
//            qDebug() << "Directory changed:" << dir;

//            // 1. 遍历指定文件夹中所有文件
//            FileUtil fileUtil(_backupDir);
//            //遍历文件夹前 确保文件夹存在 不存在创建
//            if (fileUtil.Exists() == false)
//            {
//                qDebug()<<"RunClientBackupModule"<< QString::fromStdString(_backupDir)<<"不存在！";
//                return false;
//            }
//            std::vector<std::string> array;
//            fileUtil.ScanDirectory(&array);

//            // 2. 逐个判断文件是否需要上传
//            for (auto& perFile : array)
//            {
//                if (IsNeedUpload(perFile) == false)
//                    continue;

//                // 3. 需要上传则上传文件
//                if (Upload(perFile) == true)
//                {
//                    // 上传成功 代表该文件已备份 需要添加备份信息
//                    _dataManager->Insert_Table(perFile, GetFileSelfEtag(perFile));
//                }
//            }
//            return true;
//        });
//        return true;
//    }
//};
//}

//#endif //__MY_ClientBackup__
